import Request from './request';
import apiList from './apis.js';
import store from '@/shopro/store/index.js';
import { API_URL, API_URL_V1 } from '@/env';
const shoproRequest = new Request();
export default function http(
  url,
  data = {},
  toastBefore = '', // 请求前加载提示
  toastAfter = true // 请求后错误提示
) {
  let api = getApiPath(url);
  let new_url = api.url || '';
  Object.keys(data).forEach((item) => {
    const ele = data[item];
    const check = new_url.indexOf(`{${item}}`);
    if (check >= 0) {
      new_url = new_url.replace(`{${item}}`, `${ele}`);
      Reflect.deleteProperty(data, item);
    }
  });
  if (url.indexOf('v1.') >= 0) {
    new_url = API_URL_V1 + new_url;
  } else {
    new_url = API_URL + new_url;
  }
  /* 请求之前拦截器 */
  shoproRequest.interceptor.request((config, cancel) => {
    let token = uni.getStorageSync('token');
    if (api.auth && !token) {
      store.dispatch('showAuthModal');
      uni.hideLoading();
      throw `暂未登录,已阻止此次API请求: '${new_url}'`;
    }
    token &&
      shoproRequest.setConfig((config) => {
        config.header.token = token;
      });
    if (toastBefore !== '') {
      uni.showLoading({
        title: toastBefore,
        mask: true,
      });
    }
    return config;
  });

  /* 请求之后拦截器 */
  shoproRequest.interceptor.response((response) => {
    uni.hideLoading();
    if (response.code === 0) {
      if (toastAfter) {
        uni.showToast({
          title: response.msg || '请求出错,稍后重试',
          icon: 'none',
          duration: 1000,
          mask: true,
        });
      }
    }

    // token过期注销
    if (response.code === 401) {
      store.dispatch('logout');
      store.dispatch('showAuthModal');
      throw `登录已过期或注销,已阻止此次API请求: '${new_url}'`;
    }
    return response;
  });

  return shoproRequest.request({
    url: new_url,
    data,
    method: api.method,
  });
}

// 组装接口路径
function getApiPath(url) {
  let apiArray = url.split('.');
  let api = apiList;
  apiArray.forEach((v) => {
    api = api[v];
  });
  return api;
}
